/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import Controller.PaiementController;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;

/**
 *
 * @author Hugo
 */
public class Paiement extends AbstractModel {

    private LinkedList<LignePaiement> chambrePaiement = new LinkedList<>();
    private double SousTotal = 0;
    private double Total = 0;
    private double TPS = 0;
    private double TVQ = 0;
    
    //constructeurs
    public Paiement(){
        
    }
    
    public void updatePaiement(){
        GrandLivre.getInstance().addPaiement(this);
        firePropertyChange(PaiementController.AJOUTER_PAIEMENT_EVENT, null, this);
    }
    
    public void addListeChambre(LignePaiement lignePaiement){
        chambrePaiement.add(lignePaiement);
        updateListeChambre();
    }
            
    public void updateListeChambre(){
        String[][] listeChambre = new String[chambrePaiement.size()][2];
        
        for(int i = 0; i < chambrePaiement.size(); i++){
            listeChambre[i][0] = String.valueOf(chambrePaiement.get(i).getChambre().getNumeroChambre());
            listeChambre[i][1] = chambrePaiement.get(i).getChambre().getCategorie().getNomCategorie();
        }
        
        firePropertyChange(PaiementController.LISTE_CHAMBRE_PROPERTY, chambrePaiement, listeChambre);
    }
    
    public void updateSousTotal(){
        
        if(SousTotal == 0){
            double sousTotalFacture = 0;
            
            //on cherche tout les 
            for(int i=0; i< chambrePaiement.size(); i++){
                while(chambrePaiement.get(i).getDateDebut().getDate() != chambrePaiement.get(i).getDateFin().getDate()){

                    Date dateDebut = chambrePaiement.get(i).getDateDebut();
                    
                    //on ajoute le prix de la haute/basse saison de la catégorie au sous total
                    if(isBetween(dateDebut, GrandLivre.getInstance().getDebutHauteSaison(), GrandLivre.getInstance().getFinHauteSaison()))
                        sousTotalFacture += chambrePaiement.get(i).getChambre().getCategorie().getPrixBasseSaison();
                    else
                        sousTotalFacture += chambrePaiement.get(i).getChambre().getCategorie().getPrixBasseSaison();

                    dateDebut = addDays(chambrePaiement.get(i).getDateDebut(), 1);
                    chambrePaiement.get(i).setDateDebut(dateDebut);
                }
            }
            SousTotal = sousTotalFacture;
        }
        firePropertyChange(PaiementController.SOUS_TOTAL_PROPERTY, 0, SousTotal);
    }
    
    public void updateTPS(){
        TPS = (SousTotal * 0.05);
        firePropertyChange(PaiementController.TPS_PROPERTY, 0, TPS);
    }
    
    public void updateTVQ(){
        TVQ = ((SousTotal + TPS) * 0.095);
        firePropertyChange(PaiementController.TVQ_PROPERTY, 0, TVQ);
    }
    
    public void updateTotal(){
        Total = SousTotal + TPS + TVQ;
        firePropertyChange(PaiementController.TOTAL_PROPERTY, 0, Total);
    }
    
    public static Date addDays(Date date, int days)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); //minus number would decrement the days
        return cal.getTime();
    }
    
    public boolean isBetween(Date dteChecking, Date dteDebut, Date dteFin){
        if(dteChecking.getMonth() >= dteDebut.getMonth() && dteChecking.getDate() >= dteDebut.getDate() &&
                dteChecking.getMonth() <= dteFin.getMonth() && dteChecking.getDate()<=dteFin.getDate()){
            return true;
        }
        return false;
    }
}
